package com.xinggq.common.context;

import org.springframework.core.env.Environment;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * 用户上下文工具类
 * 用于获取当前用户信息，支持测试环境下的默认用户设置
 * 通过策略模式支持不同环境下的不同实现
 * 
 * @author xinggq
 * @since 2025/1/20
 */
public final class UserContext {

  /**
   * 用户上下文提供者列表，使用线程安全的集合
   */
  private static final List<UserContextProvider> providers = new CopyOnWriteArrayList<>();

  /**
   * Spring环境对象，用于判断当前环境
   */
  private static Environment environment;

  /**
   * 私有构造方法，防止实例化
   */
  private UserContext() {
    throw new UnsupportedOperationException("工具类不允许实例化");
  }

  /**
   * 设置Spring环境对象
   * 
   * @param env Spring环境对象
   */
  public static void setEnvironment(Environment env) {
    environment = env;
    // 环境设置后，自动注册测试环境提供者
    registerProvider(new TestUserContextProvider(env));
  }

  /**
   * 注册用户上下文提供者
   * 
   * @param provider 用户上下文提供者
   */
  public static void registerProvider(UserContextProvider provider) {
    if (provider != null) {
      // 移除已存在的同类型提供者
      providers.removeIf(p -> p.getClass().equals(provider.getClass()));
      providers.add(provider);
      // 按优先级排序
      providers.sort((p1, p2) -> Integer.compare(p1.getPriority(), p2.getPriority()));
    }
  }

  /**
   * 获取当前适用的用户上下文提供者
   * 
   * @return 用户上下文提供者，如果没有找到返回null
   */
  private static UserContextProvider getCurrentProvider() {
    for (UserContextProvider provider : providers) {
      if (provider.isApplicable()) {
        return provider;
      }
    }
    return null;
  }

  /**
   * 获取当前用户ID
   * 
   * @return 用户ID，如果未找到提供者或用户未登录返回null
   */
  public static Long getCurrentUserId() {
    UserContextProvider provider = getCurrentProvider();
    if (provider == null) {
      return null;
    }
    
    UserInfo userInfo = provider.getCurrentUser();
    return userInfo != null ? userInfo.getUserId() : null;
  }

  /**
   * 获取当前用户名
   * 
   * @return 用户名，如果未找到提供者或用户未登录返回null
   */
  public static String getCurrentUsername() {
    UserContextProvider provider = getCurrentProvider();
    if (provider == null) {
      return null;
    }
    
    UserInfo userInfo = provider.getCurrentUser();
    return userInfo != null ? userInfo.getUsername() : null;
  }

  /**
   * 获取当前用户真实姓名
   * 
   * @return 用户真实姓名，如果未找到提供者或用户未登录返回null
   */
  public static String getCurrentRealName() {
    UserContextProvider provider = getCurrentProvider();
    if (provider == null) {
      return null;
    }
    
    UserInfo userInfo = provider.getCurrentUser();
    return userInfo != null ? userInfo.getRealName() : null;
  }

  /**
   * 获取当前用户邮箱
   * 
   * @return 用户邮箱，如果未找到提供者或用户未登录返回null
   */
  public static String getCurrentEmail() {
    UserContextProvider provider = getCurrentProvider();
    if (provider == null) {
      return null;
    }
    
    UserInfo userInfo = provider.getCurrentUser();
    return userInfo != null ? userInfo.getEmail() : null;
  }

  /**
   * 获取当前用户租户ID
   * 
   * @return 租户ID，如果未找到提供者或用户未登录返回null
   */
  public static Long getCurrentTenantId() {
    UserContextProvider provider = getCurrentProvider();
    if (provider == null) {
      return null;
    }
    
    UserInfo userInfo = provider.getCurrentUser();
    return userInfo != null ? userInfo.getTenantId() : null;
  }

  /**
   * 检查当前是否有已认证的用户
   * 
   * @return 如果有已认证用户返回true，否则返回false
   */
  public static boolean hasCurrentUser() {
    UserContextProvider provider = getCurrentProvider();
    return provider != null && provider.hasCurrentUser();
  }

  /**
   * 获取当前用户完整信息
   * 
   * @return 用户信息对象，如果未找到提供者或用户未登录返回null
   */
  public static UserInfo getCurrentUserInfo() {
    UserContextProvider provider = getCurrentProvider();
    return provider != null ? provider.getCurrentUser() : null;
  }

  /**
   * 清除所有注册的提供者（主要用于测试）
   */
  public static void clearProviders() {
    providers.clear();
  }

  /**
   * 获取已注册的提供者数量（主要用于测试）
   * 
   * @return 提供者数量
   */
  public static int getProviderCount() {
    return providers.size();
  }
}